package 反射;

//《Java Field类》
//Field是一个类,位于Java.lang.reflect包下，在Java反射中Field用于获取某个类的属性或该属性的属性值。
//
//《获取Field类对象》
//1. Class.getDeclaredField(String name);
//返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段（包括私有成员）。
//
//2. Class.getDeclaredFields();
//返回 Field 对象的一个数组，该数组包含此 Class 对象所表示的类或接口所声明的所有字段（包括私有成员）。
//
//3. Class.getField(String name);
//返回一个 Field 对象，它反映此 Class 对象所表示的类或接口（含父类）的指定公共成员字段。
//
//4. Class.getFields();
//返回一个包含某些 Field 对象的数组，该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段（含父类）。
//
//《主要方法》
//getType()： 获取属性声明时类型对象（返回class对象）
//
//getGenericType() ： 返回属性声的Type类型
//
//getName() ： 获取属性声明时名字
//
//getAnnotations() ： 获得这个属性上所有的注释
//
//getModifiers() ： 获取属性的修饰
//
//isEnumConstant() ： 判断这个属性是否是枚举类
//
//isSynthetic() ： 判断这个属性是否是 复合类
//
//get(Object obj) ： 取得obj对象这个Field上的值
//
//set(Object obj, Object value) ： 向obj对象的这个Field设置新值value
//
//例子
//Person.java
import java.lang.reflect.Field;
class Persona{  
	public String name;  
	private Integer age;  
	private String sex;  
	//省略所有属性的set、get方法
}
public class Field类{   
    public static void main(String[]args) throws NoSuchFieldException, SecurityException {  
        Persona person =new Persona();  
        //通过Class.getDeclaredField(String name)获取类或接口的指定已声明字段。  
        Field f1=person.getClass().getDeclaredField("name");  
        System.out.println("-----Class.getDeclaredField(String name)用法-------");  
        System.out.println(f1);//public java.lang.String 反射.Persona.name 
        System.out.println("-----Class.getDeclaredFields()用法-------");  
        //通过Class.getDeclaredFields()获取类或接口的指定已声明字段。  
        Field []f2=person.getClass().getDeclaredFields();  
        for(Field field:f2){  
            System.out.println(field);
            //public java.lang.String 反射.Persona.name
            //private java.lang.Integer 反射.Persona.age
            //private java.lang.String 反射.Persona.sex
        }  
        System.out.println("-----Class.getField(String name)用法-------");  
        //通过Class.getField(String name)返回一个类或接口的指定公共成员字段，私有成员报错。  
        Field f3=person.getClass().getField("name");  
        System.out.println(f3);//public java.lang.String 反射.Persona.name  
        //如果获取age属性(私有成员) 则会报错  
        //Field f3=person.getClass().getField("name");  
        System.out.println("-----Class.getFields()用法-------");  
        //通过Class.getField()，返回 Class 对象所表示的类或接口的所有可访问公共字段。  
        Field []f4=person.getClass().getFields();  
        for(Field fields:f4) {  
            //因为只有name属性为共有，因此只能遍历出name属性  
            System.out.println(fields);//public java.lang.String 反射.Persona.name 
        }  
    }  
} 

//总结
//Field类中最常用的是get(Object obj)和set(Object obj, Object value)这两个方法，所以这两个方法是最重要的。
